home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Interactive 7
/
PC World Interactive 7.iso
/
program
/
pasprog.EXE
/
POSTFIX.TXT
< prev
next >
Wrap
Text File
|
1980-01-10
|
6KB
|
122 lines
┌──────────────────────────────────────────────────────────────────────────┐
│┌────────────────────────────────────────────────────────────────────────┐│
││ ││
││ Bir Derleyici Yazmak ÿster misiniz? ││
││ ││
│└────────────────────────────────────────────────────────────────────────┘│
│ PS 31 · ₧ubat'96 Tunç Sabuncu │
└──────────────────────────────────────────────────────────────────────────┘
Programlarìnìzì yazmak için kullandìºìnìz derleyicilerin nasìl çalìƒtìºìnì
hiç merak ettiniz mi ? PASCAL ya da PROLOG gibi bir dilde yazìlmìƒ kaynak
kodu okuyan hatta anlayan ve orada tanìmlanan süreçleri PC'nizin
anlayabileceºi tek dil olan makina diline çeviren bu programlarìn yazìlmasì
gerçekten çok zor ve uzun bir uºraƒtìr. Bu nedenle kimse kendi baƒìna
derleyici yazmaya kalkìƒmaz. Yazìlìmevleri ekipler kurup deneyimli
programcìlar arasìnda iƒbölümü yaparlar. Tasarìm ve kodlama ile geçen uzun
bir dönemden sonra daha uzun bir zaman denemeler için ayrìlìr. Çünkü kimse
"bazì PASCAL programlarìnì derleyen" bir programa para ödemez. Eh artìk
herhalde tek baƒìnìza derleyici yazmaya kalkìƒmazsìnìz! ₧aka bir yana, sonucu
ne olursa olsun her uºraƒ ( derleyici yazmaya çalìƒmak dahil ) size birƒeyler
kazandìrìr. Ama gelin biz biraz akademik takìlalìm.
Bir süredir burada 'ÿnce ÿƒler" baƒlìºì ile tanìtmaya çalìƒtìºìmìz veri
yapìlarì size derleyici ve yorumlayìcì ( kaynak kodu bellekte çalìƒtìran,
EXE oluƒturmayan programlar. sözgelimi GWBASIC ) yazmanìn kapìlarìnì
açacak altìn bir anahtar. Aslìnda Programlama Sanatì'nìn önceki sayìlarìnda
da bu konulara deºindik. "Pascal'da baºlì listeler" baƒlìºì ile verilen
programlar veri yapìlarìnìn alt baƒlìklarìndan. Özetle yìºìt, kuyruk, baºlì
listeler ve aºaçlarì bilmeden derleyici yazmaya çalìƒmak biraz körebe
oynamaya benziyor.
Laf-ì güzafì bir yana bìrakalìm ve konuya yeni ìsìnan okuyucularìmìz için
derleyicilerin gerçekte ne yaptìklarìnì kìsaca anlatalìm. Siz programcì
olarak PC'niz için hiçbir anlamì olmayan 'print' ya da 'a:=b+c' gibi
laflarì yazìp ondan birƒeyler beklersiniz. ÿƒte derleyiciler bu ASCII
yìºìnìnì bazen satìr numaralarìnì ( BASIC ) bazen ';' gibi iƒaretleri
( PASCAL ) bazen de '(' gibi ayraçlarì ( LISP ) kullanarak parçalarlar.
Buraya kadar basit. Fakat bundan sonra deºiƒik algoritmalarla kurulmuƒ
çözümleyicileri ( parser ) kullanarak sizin pascalca anlattìºìnìz
iƒleri ( dìƒarìdan bir sayì al, ikiyle çarp, ekrana yaz vb. ) bellekte
simgelerler. ÿƒte veri yapìlarì bu noktada devreye girer. Sözgelimi
a=b+c gibi bir ifade,
a
/ \
= +
/ \
b c
böyle bir aºaçta simgelenir. Bu aºaçlara da çözümleme aºaçlarì denir.
( Çözümleyicilere ve aºaçlara gelecek sayìlarda deºineceºiz. )
Çözümleyici birim, üzerine düƒeni yaptìktan sonra sìra deºerlendirme ve
kod üretme modülüne gelir. Bu aºaç için üretilecek ASSEMBLY kodu ise
mov AX,WORD PTR b
add AX,WORD PTR c
mov WORD PTR a,AX
olacaktìr. Daha önceki yazìlarìmìzdan tanìdìºìnìz yìºìt veri tipi
matematiksel ifadelerin hem deºerlendirilmesinde hem de ASSEMBLY'ye
çevirilmesinde kullanìlìr.
Postfix ve Prefix
Bizim günlük yaƒamìmìzda ve PASCAL, C gibi dillerde kullandìºìmìz
sìralama alternatifsiz deºildir. Matematiksel iƒaretlerin deºiƒken
grubunun önüne ya da ardìna sìralanmasì da olasìdìr. Bu iki seçenekle
birlikte geleneksel yaklaƒìm aƒaºìdaki tabloda verilmiƒtir.
infix postfix prefix
A+B AB+ +AB
A+B-C AB+C- -+ABC
(A+B)*(C-D) AB+CD-* *+AB-CD
A^B*C-D+E/F/(G+H) AB^C*D-EF/GH+/+ +-*^ABCD//EF+GH
((A+B)*C-(D-E))^(F+G) AB+C*DE--FG+^ ^-+ABC-DE+FG
A-B/(C*D^E) ABCDE^*/- -A/B*C^DE
Bu ay ki kodumuzun temelini oluƒturan postfix'i gözönüne alacak olursak,
deºerlendirme süreci ƒöyle iƒler: Bir matematiksel iƒarete gelene dek
deºiƒkenler ( ya da sayìlar ) sìrasìyla PUSH edilir ( yìºìta konur ) .
Bir iƒarete gelindiºinde PUSH edilmiƒ olanlar POP edilerek ( yìºìttan
alìnarak ) iƒlem, üzerlerinde uygulanìr. Örneºin tablodaki ilk satìrda
A ve B önce push edilir, '+' iƒareti gelince pop edilerek toplanìr.
( Diºer satìrlar için sayìlar vererek kendinizi deneyebilirsiniz. )
₧imdi gelelim derleyici yazma kìsmìna!
Öyle bir program yazalìm ki postfix gösterimde girdiºimiz matemetiksel
ifadelere karƒìlìk gelen ASSEMBLY kodunu yazsìn. Biz konunun daha iyi
anlaƒìlmasì için basit bir ASSEMBLY tanìmladìk. Altì tane komut var:
ADD, SUB, MUL, DIV, MOV, PUT. Assembly'miz veri aktarìmì için geçici bir
deºiƒkene gerek duyarsa TEMP_1, TEMP_2 gibi kaynak koda dahil edebiliyor.
Bu iƒ için PUT, tek yazmaçìna ( register ) atama yapmak içinse MOV.
Örneºin 'ab+' postfix ifadesi için ƒu kod üretiliyor:
MOV a
ADD b
PUT TEMP_1
Eºer 'ab+c*de--fg+' ifadesi girilecek olursa sonuç biraz daha uzun:
MOV a
ADD b
PUT TEMP_1
MOV TEMP_1
MUL c
PUT TEMP_2
MOV d
SUB e
PUT TEMP_3
MOV TEMP_2
SUB TEMP_3
MOV f
ADD g
PUT TEMP_5
Artìk bir derleyicinin çalìƒma ƒekli hakkìnda hiç de azìmsanmayacak bir
bilgi sahibi oldunuz. Kaynak kod dìƒìnda hiçbir eksiºiniz kalmadì.
Haydi davranìn tuƒlara...